
#include "simbol.h"
#include <math.h>

//retorna a distancia euclidiana entre v1 e v2
float euclidianDistance(float v1[DESCRIPTOR_SIZE], float v2[DESCRIPTOR_SIZE]){
    float result = 0.0;
    int i;
    for(i = 0; i < DESCRIPTOR_SIZE; i++) result += pow((v1[i] - v2[i]), 2);
    return sqrt(result);
}

//libera memoria
void freeMem(DescriptorResults *dr){
    if (dr == NULL) return;
    if (dr->next != NULL) freeMem(dr->next);
    free(dr);
}

//adiciona o descritor _new de forma ordenada na lista _list
DescriptorResults* insertionSort(DescriptorResults* results, DescriptorResults *_new, int max){
    if (max == 0) {
        freeMem(results);
        return NULL;
    }
    if (results == NULL) return _new;

    if (_new->distance <= results->distance){
        _new->next = results;
        return _new;
    }
    results->next = insertionSort(results->next, _new, --max);
    return results;
}

//calcula a disntancia entre o vetor searchFor e todos os descritores da lista
DescriptorResults* greedySearch(Descriptor* _list, float searchFor[DESCRIPTOR_SIZE], int totalHits){
    DescriptorResults * results = NULL;
    DescriptorResults *newdr;
    while (_list != NULL){
        newdr = (DescriptorResults *)malloc(sizeof(DescriptorResults));
        newdr->descriptor = _list;
        newdr->distance = euclidianDistance(searchFor, _list->descr);
        newdr->next = NULL;
        results = insertionSort(results, newdr, totalHits);
        _list = _list->next;
    }
    return results;
}
